/*
 * Universidad del Valle de Guatemala
 * Programacion Orientada a Objetos
 * Edwin Jose Xico Tzian
 * Carne: 11090
 * Seccion:
 * Archivo: ProbandoParticipante.java
 */

package paricao1pooxico11090;
import java.util.Scanner;
/**
 * @author edwin
 */
public class ProbandoParticipante {

    private static Scanner reader = new Scanner(System.in);

    /**
     * Metodo utilizado para ingresar datos de tipo flout, siempre y cuando
     * esttos sean mayores a 0.
     **/
    public static float IngresoPositivo() {
        boolean s;
        s = false;
        float num = 23;
        String f;
        do{
            f = reader.next();
            try {
                num = Integer.parseInt(f);
                if (num > 0){
                    s = true;
                    return num;
                }
            }
            catch (NumberFormatException nfe) {
                System.out.println("Usted no ha ingresado un dato valido," +
                        " intente ingresar un numero entero positivo: ");
                s = false;
            }

        } while(s == false);
        return num;
    }

    /**
     * metodo utilizado para solicitar un numero y finaliza hasta que el numero
     * ingresado es entero y positivo
     * @return num, un numero entero y positivo
     */
    public static int IngresoEnteroPositivo() {
        boolean s;
        s = false;
        int num = 23;
        String f;
        do{
            f = reader.next();
            try {
                num = Integer.parseInt(f);
                if (num > 0){
                    s = true;
                    return num;
                }
            }
            catch (NumberFormatException nfe) {
                System.out.println("Usted no ha ingresado un dato valido," +
                        " intente ingresar un numero entero positivo: ");
                s = false;
            }

        } while(s == false);
        return num;
    }

    /**
     * @param a : dato menor o igual al  limite del rango.
     * @param b : dato mayor o igual al limite del rango.
     * @return el numero indicado por el usuario que se encuentra dentro del
     * rango.
     */
    public static int IngresoRango(int a, int b) {
        boolean s;
        s = false;
        int num = 23;
        String f;
        do{
            f = reader.next();
            try {
                num = Integer.parseInt(f);
                if (num >= a && num <= b){
                    s = true;
                    return num;
                }
                else System.out.println("El numero que ha ingreado no se " +
                        "encuentra en el rango de " + a + " a " + b + "." +
                        "\nIntente nuevamente: ");
            }
            catch (NumberFormatException XXX) {
                System.out.println("Usted no ha ingresado un dato valido, " +
                        "intente ingresar un numero entero");
                s = false;
            }

        } while(s == false);
        return num;
    }

    /**
     * Metodo que solicita el ingreso de los tiempos de cada participante
     * @param participantex  el ingreso se realiza por participante.
     * @param deportesx listado de los deportes involucrados.
     */
    private static void setTiemposParticipantes(Participante participantex, String[] deportesx){
        for(int i = 0; i < participantex.getTiemposJugador().length; i++){
            float sumatoria = 0;
            if (i < (participantex.getTiemposJugador().length-1)){
                System.out.println("Cual fue el tiempo de " + participantex.getNombre() +
                    " en " + deportesx[i] + "?");
                float num = IngresoPositivo();
                participantex.getTiemposJugador()[i] = num;
                sumatoria += num;
            }
            if (i == (participantex.getTiemposJugador().length - 1)){
                participantex.getTiemposJugador()[i] = sumatoria;
            }
        }
    }


    /**
     * @param participantex
     * @param indicadorx : indica la posicion del valor en la lista de tiempos de
     *        cada jugador.
     * @return el nombre del jugador con el mejor tiempo
     */
    private static String getMejorTiempo(Participante[] participantex, int indicadorx){
        String namex = null;
        double mejor = 0;
        for (int h = 0; h < participantex.length; h++){
            if (participantex[h].getTiemposJugador()[indicadorx] > mejor){
                mejor = participantex[h].getTiemposJugador()[indicadorx];
                namex = participantex[h].getNombre();
            }
        }
        return namex;
    }


    /**
     * @param participantex
     * @param indicadorx indica la posicion del tiempo en la lista de datos del
     *        participante
     * @return el nobmre con el jugador con el peor tiemo
     */
    private static String getPeorTiempo(Participante[] participantex, int indicadorx){
        String namex = null;
        double peor = participantex[0].getTiemposJugador()[indicadorx];
        for (int h = 0; h < participantex.length; h++){
            if (participantex[h].getTiemposJugador()[indicadorx] < peor){
                peor = participantex[h].getTiemposJugador()[indicadorx];
                namex = participantex[h].getNombre();
            }
            else {
                namex = participantex[0].getNombre();
            }
        }
        return namex;
    }


    //Inicio del Main
    public static void main(String[] args){
        int dox;

        do {

        String[] deportes = {"Natacion","Bicicleta","Maraton"};
        Participante[] participantes;
        
        //Ingreso de los Datos
        System.out.println("Cuantos Participantes desea agregar");
        int no_vendedores = IngresoEnteroPositivo();
        participantes = new Participante[no_vendedores];
        System.out.println();
        for (int y = 0; y < participantes.length; y++){
            System.out.println("Cual es el nombre del participante no. " + (y+1)
                    + "?");
            String nombre_participante = reader.next();
            participantes[y] = new Participante(nombre_participante);
            setTiemposParticipantes(participantes[y], deportes);
        } // fin del igreso de datos

        //Despliegue del menu
        int option;
        do {
            System.out.println("\t Menú");
            System.out.println("1. ¿Que particpante fue más rápido en natación?");
            System.out.println("2. ¿Que participante fue menos rápido en maratón?");
            System.out.println("3. ¿QUÉ participante acumuló MENOS tiempo durante " +
                    "toda la triatlón?");
            System.out.println("4. ¿QUÉ participante acumuló MÁS tiempo durante toda la triatlón?");
            System.out.println("0. Salir");
            option = IngresoRango(0,5);
            switch(option) {
                case 1: {
                    System.out.println("El participante con el mejor tiempo en " +
                            "natacion fue: " + getMejorTiempo(participantes,0) + "\n");
                    break;
                }
                case 2: {
                    System.out.println("El participante menos rapido en maraton " +
                            "fue: " + getPeorTiempo(participantes,2) + "\n");
                    break;
                }
                case 3: {
                    System.out.println("El participante con el peor tiempo en " +
                            "toda el triatlón fue: " +
                            getPeorTiempo(participantes,3) + "\n");
                    break;
                }
                case 4: {
                    System.out.println("El participante con el peor tiempo en " +
                            "la maraton fue: " + getMejorTiempo(participantes,3) +
                            "\n");
                    break;
                }
                case 0: {
                    option = 0;
                    break;
                }
                default:{
                    System.out.println("Opción no valida...");
                }
            }
        } while (option != 0);

        System.out.println("1. Reiniciar el programa.");
        System.out.println("0. Salir del programa.");
        dox = IngresoRango(0,1);

        } while (dox != 0);
    }
}
